// $Id: Genotipo.java,v 1.10 2007-04-12 00:03:51 raul Exp $
package futbol.tacticas.concursantes2007.TacticaTururu;

import java.util.Random;


/**
 * Esta clase representa el genotipo de un individuo en concreto
 */
public class Genotipo {
    // ---------------------- //
    // ATRIBUTOS DEL GENOTIPO //
    // ---------------------- //
	private Fuerza fuerza;
	private Alineacion[] alineacion = new Alineacion[2];
	private DistanciaIrBola[] distancia = new DistanciaIrBola[2];
	private int [] porteroBarrera = new int[2];
	private int [] porteroLateral = new int[2];
	private int [] porteroFactorProximidad = new int[2];
	private int [] defensaFactorProximidad = new int[2];
	private int [] defensaTerminoProximidad = new int[2];
	private int [] entrenadorLineaDefensiva = new int[2];
	private int [] entrenadorDistanciaMinimaPase = new int[2];


    // --------------------------- //
    // CONSTRUCTORES E INICIADORES //
    // --------------------------- //


    public Jugador [] configurarJugadores (final Jugador[] _jugador ,final Alineacion laAlineacion, final Fuerza laFuerza) {
    	Jugador [] jugador = _jugador;
        int [] alineacionBruto = laAlineacion.getAlineacion();
        int [] fuerzaBruto = laFuerza.getFuerza();
        int jugadoresUbicados = 0;

        // configuramos al portero
        jugador[Constantes.PORTERO].setPosicionXY(-150, 0);
        jugador[Constantes.PORTERO].setFuerza(fuerzaBruto[Constantes.LINEA_PORTERO]);
        jugadoresUbicados ++;

        for (int i = 0; i < Constantes.LINEAS_JUEGO; i++) {
            if (alineacionBruto[i] == 1) {
                if (i == Constantes.LINEA_DEFENSIVA) {
                	jugador[jugadoresUbicados].setPosicionXY(-95, 0);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_DEFENSIVA]);

                } else if (i == Constantes.LINEA_CENTRO_CAMPO_ATRAS) {
                	jugador[jugadoresUbicados].setPosicionXY(-35, 0);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ATRAS]);

                } else if (i == Constantes.LINEA_CENTRO_CAMPO_ALANTE) {
                	jugador[jugadoresUbicados].setPosicionXY(35, 0);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ALANTE]);

                } else if (i == Constantes.LINEA_DELANTERA) {
                	jugador[jugadoresUbicados].setPosicionXY(95, 0);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_DELANTERA]);

                }
            } else if (alineacionBruto[i] == 2) {
                if (i == Constantes.LINEA_DEFENSIVA) {
                	jugador[jugadoresUbicados].setPosicionXY(-95, 60);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_DEFENSIVA]);
                	jugador[jugadoresUbicados + 1].setPosicionXY(-95, -50);
                	jugador[jugadoresUbicados + 1].setFuerza(fuerzaBruto[Constantes.LINEA_DEFENSIVA]);

                } else if (i == Constantes.LINEA_CENTRO_CAMPO_ATRAS) {
                	jugador[jugadoresUbicados].setPosicionXY(-35, 60);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ATRAS]);
                	jugador[jugadoresUbicados + 1].setPosicionXY(-35, -50);
                	jugador[jugadoresUbicados + 1].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ATRAS]);

                } else if (i == Constantes.LINEA_CENTRO_CAMPO_ALANTE) {
                	jugador[jugadoresUbicados].setPosicionXY(35, 60);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ALANTE]);
                	jugador[jugadoresUbicados + 1].setPosicionXY(35, -50);
                	jugador[jugadoresUbicados + 1].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ALANTE]);

                } else if (i == Constantes.LINEA_DELANTERA) {
                	jugador[jugadoresUbicados].setPosicionXY(95, 60);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_DELANTERA]);
                	jugador[jugadoresUbicados + 1].setPosicionXY(95, -50);
                	jugador[jugadoresUbicados + 1].setFuerza(fuerzaBruto[Constantes.LINEA_DELANTERA]);
                }
            } else if (alineacionBruto[i] == 3) {
                if (i == Constantes.LINEA_DEFENSIVA) {
                	jugador[jugadoresUbicados].setPosicionXY(-95, 60);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_DEFENSIVA]);
                	jugador[jugadoresUbicados + 1].setPosicionXY(-95, -50);
                	jugador[jugadoresUbicados + 1].setFuerza(fuerzaBruto[Constantes.LINEA_DEFENSIVA]);
                	jugador[jugadoresUbicados + 2].setPosicionXY(-95, 0);
                	jugador[jugadoresUbicados + 2].setFuerza(fuerzaBruto[Constantes.LINEA_DEFENSIVA]);

                } else if (i == Constantes.LINEA_CENTRO_CAMPO_ATRAS) {
                	jugador[jugadoresUbicados].setPosicionXY(-35, 60);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ATRAS]);
                	jugador[jugadoresUbicados + 1].setPosicionXY(-35, -50);
                	jugador[jugadoresUbicados + 1].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ATRAS]);
                	jugador[jugadoresUbicados + 2].setPosicionXY(-35, 0);
                	jugador[jugadoresUbicados + 2].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ATRAS]);

                } else if (i == Constantes.LINEA_CENTRO_CAMPO_ALANTE) {
                	jugador[jugadoresUbicados].setPosicionXY(35, 60);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ALANTE]);
                	jugador[jugadoresUbicados + 1].setPosicionXY(35, -50);
                	jugador[jugadoresUbicados + 1].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ALANTE]);
                	jugador[jugadoresUbicados + 2].setPosicionXY(35, 0);
                	jugador[jugadoresUbicados + 2].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ALANTE]);

                } else if (i == Constantes.LINEA_DELANTERA) {
                	jugador[jugadoresUbicados].setPosicionXY(95, 60);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_DELANTERA]);
                	jugador[jugadoresUbicados + 1].setPosicionXY(95, -50);
                	jugador[jugadoresUbicados + 1].setFuerza(fuerzaBruto[Constantes.LINEA_DELANTERA]);
                	jugador[jugadoresUbicados + 2].setPosicionXY(95, 0);
                	jugador[jugadoresUbicados + 2].setFuerza(fuerzaBruto[Constantes.LINEA_DELANTERA]);
                }

            } else if (alineacionBruto[i] == 4) {
                if (i == Constantes.LINEA_DEFENSIVA) {

                	jugador[jugadoresUbicados].setPosicionXY(-95, -90);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_DEFENSIVA]);
                	jugador[jugadoresUbicados + 1].setPosicionXY(-95, -25);
                	jugador[jugadoresUbicados + 1].setFuerza(fuerzaBruto[Constantes.LINEA_DEFENSIVA]);
                	jugador[jugadoresUbicados + 2].setPosicionXY(-95, 25);
                	jugador[jugadoresUbicados + 2].setFuerza(fuerzaBruto[Constantes.LINEA_DEFENSIVA]);
                	jugador[jugadoresUbicados + 3].setPosicionXY(-95, 70);
                	jugador[jugadoresUbicados + 3].setFuerza(fuerzaBruto[Constantes.LINEA_DEFENSIVA]);

                } else if (i == Constantes.LINEA_CENTRO_CAMPO_ATRAS) {
                	jugador[jugadoresUbicados].setPosicionXY(-35, -90);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ATRAS]);
                	jugador[jugadoresUbicados + 1].setPosicionXY(-35, -25);
                	jugador[jugadoresUbicados + 1].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ATRAS]);
                	jugador[jugadoresUbicados + 2].setPosicionXY(-35, 25);
                	jugador[jugadoresUbicados + 2].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ATRAS]);
                	jugador[jugadoresUbicados + 3].setPosicionXY(-35, 70);
                	jugador[jugadoresUbicados + 3].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ATRAS]);

                } else if (i == Constantes.LINEA_CENTRO_CAMPO_ALANTE) {
                	jugador[jugadoresUbicados].setPosicionXY(35, -90);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ALANTE]);
                	jugador[jugadoresUbicados + 1].setPosicionXY(35, -25);
                	jugador[jugadoresUbicados + 1].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ALANTE]);
                	jugador[jugadoresUbicados + 2].setPosicionXY(35, 25);
                	jugador[jugadoresUbicados + 2].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ALANTE]);
                	jugador[jugadoresUbicados + 3].setPosicionXY(35, 70);
                	jugador[jugadoresUbicados + 3].setFuerza(fuerzaBruto[Constantes.LINEA_CENTRO_CAMPO_ALANTE]);

                } else if (i == Constantes.LINEA_DELANTERA) {
                	jugador[jugadoresUbicados].setPosicionXY(95, -90);
                	jugador[jugadoresUbicados].setFuerza(fuerzaBruto[Constantes.LINEA_DELANTERA]);
                	jugador[jugadoresUbicados + 1].setPosicionXY(95, -25);
                	jugador[jugadoresUbicados + 1].setFuerza(fuerzaBruto[Constantes.LINEA_DELANTERA]);
                	jugador[jugadoresUbicados + 2].setPosicionXY(95, 25);
                	jugador[jugadoresUbicados + 2].setFuerza(fuerzaBruto[Constantes.LINEA_DELANTERA]);
                	jugador[jugadoresUbicados + 3].setPosicionXY(95, 70);
                	jugador[jugadoresUbicados + 3].setFuerza(fuerzaBruto[Constantes.LINEA_DELANTERA]);
                }
            }

            jugadoresUbicados += alineacionBruto[i];
        } // for (int i = 0; i < Util.LINEAS_JUEGO; i++)

    	return jugador;
    }

    // ------- //
    // SETTERS //
    // ------- //

    public final void setAlineacionPerdiendo (final Alineacion alineacion) {
    	this.alineacion[Constantes.PERDIENDO] = alineacion;
    }

    public final void setAlineacionEmpateGanando (final Alineacion alineacion) {
    	this.alineacion[Constantes.EMPATE_O_GANANDO] = alineacion;
    }

    public final void setFuerza(final Fuerza fuerza) {
        this.fuerza = fuerza;
    }

	public void setDistanciaPerdiendo (DistanciaIrBola distancia) {
		this.distancia[Constantes.PERDIENDO] = distancia;
	}

	public void setDistanciaEmpateGanando (DistanciaIrBola distancia) {
		this.distancia[Constantes.EMPATE_O_GANANDO] = distancia;
	}

	public void setComportamientoPorteroAleatorio () {
		this.porteroBarrera[Constantes.EMPATE_O_GANANDO] = (((Math.abs(new Random().nextInt()) % 5) * 5) + 135) * -1;
		this.porteroBarrera[Constantes.PERDIENDO] = (((Math.abs(new Random().nextInt()) % 5) * 5) + 135) * -1;
		this.porteroLateral[Constantes.EMPATE_O_GANANDO] = ((Math.abs(new Random().nextInt()) % 4) * 2) + 20;
		this.porteroLateral[Constantes.PERDIENDO] = ((Math.abs(new Random().nextInt()) % 4) * 2) + 20;
		this.porteroFactorProximidad[Constantes.EMPATE_O_GANANDO] = ((Math.abs(new Random().nextInt()) % 9) * 1) + 4;
		this.porteroFactorProximidad[Constantes.PERDIENDO] = ((Math.abs(new Random().nextInt()) % 9) * 1) + 4;
	}

	public void setComportamientoDefensaAleatorio () {

		this.defensaFactorProximidad[Constantes.EMPATE_O_GANANDO] = ((Math.abs(new Random().nextInt()) % 6) * 1) + 1;
		this.defensaFactorProximidad[Constantes.PERDIENDO] = ((Math.abs(new Random().nextInt()) % 6) * 1) + 1;
		this.defensaTerminoProximidad[Constantes.EMPATE_O_GANANDO] = ((Math.abs(new Random().nextInt()) % 6) * 5) + 0;
		this.defensaTerminoProximidad[Constantes.PERDIENDO] = ((Math.abs(new Random().nextInt()) % 6) * 5) + 0;
	}

	public void setComportamientoEntrenadorAleatorio () {

		this.entrenadorLineaDefensiva[Constantes.EMPATE_O_GANANDO] = (((Math.abs(new Random().nextInt()) % 6) * 5) + 10) * -1;
		this.entrenadorLineaDefensiva[Constantes.PERDIENDO] = (((Math.abs(new Random().nextInt()) % 6) * 5) + 10) * -1;
		this.entrenadorDistanciaMinimaPase[Constantes.EMPATE_O_GANANDO] = ((Math.abs(new Random().nextInt()) % 6) * 5) + 0;
		this.entrenadorDistanciaMinimaPase[Constantes.PERDIENDO] = ((Math.abs(new Random().nextInt()) % 6) * 5) + 0;
	}

	public void setComportamientoPortero (int barreraG, int barreraP, int lateralG, int lateralP, int factorG, int factorP) {
		this.porteroBarrera[Constantes.EMPATE_O_GANANDO] = barreraG;
		this.porteroBarrera[Constantes.PERDIENDO] = barreraP;
		this.porteroLateral[Constantes.EMPATE_O_GANANDO] = lateralG;
		this.porteroLateral[Constantes.PERDIENDO] = lateralP;
		this.porteroFactorProximidad[Constantes.EMPATE_O_GANANDO] = factorG;
		this.porteroFactorProximidad[Constantes.PERDIENDO] = factorP;
	}

	public void setComportamientoDefensa (int terminoG, int terminoP, int factorG, int factorP) {

		this.defensaFactorProximidad[Constantes.EMPATE_O_GANANDO] = factorG;
		this.defensaFactorProximidad[Constantes.PERDIENDO] = factorP;
		this.defensaTerminoProximidad[Constantes.EMPATE_O_GANANDO] = terminoG;
		this.defensaTerminoProximidad[Constantes.PERDIENDO] = terminoP;
	}

	public void setComportamientoEntrenador (int lineaG, int lineaP, int distanciaG, int distanciaP) {

		this.entrenadorLineaDefensiva[Constantes.EMPATE_O_GANANDO] = lineaG;
		this.entrenadorLineaDefensiva[Constantes.PERDIENDO] = lineaP;
		this.entrenadorDistanciaMinimaPase[Constantes.EMPATE_O_GANANDO] = distanciaG;
		this.entrenadorDistanciaMinimaPase[Constantes.PERDIENDO] = distanciaP;
	}

	public void setPorteroBarreraPerdiendo (int param) {
		porteroBarrera[Constantes.PERDIENDO] = param;
	}

	public void setPorteroBarreraEmpateGanando (int param) {
		porteroBarrera[Constantes.EMPATE_O_GANANDO] = param;
	}

	public void setPorteroLateralPerdiendo (int param) {
		porteroLateral[Constantes.PERDIENDO] = param;
	}

	public void setPorteroLateralEmpateGanando (int param) {
		porteroLateral[Constantes.EMPATE_O_GANANDO] = param;
	}

	public void setPorteroFactorProximidadPerdiendo (int param) {
		porteroFactorProximidad[Constantes.PERDIENDO] = param;
	}

	public void setPorteroFactorProximidadEmpateGanando (int param) {
		porteroFactorProximidad[Constantes.EMPATE_O_GANANDO] = param;
	}

	public void setDefensaFactorProximidadPerdiendo (int param) {
		defensaFactorProximidad[Constantes.PERDIENDO] = param;
	}

	public void setDefensaFactorProximidadEmpateGanando (int param) {
		defensaFactorProximidad[Constantes.EMPATE_O_GANANDO] = param;
	}

	public void setDefensaTerminoProximidadPerdiendo (int param) {
		defensaTerminoProximidad[Constantes.PERDIENDO] = param;
	}

	public void setDefensaTerminoProximidadEmpateGanando (int param) {
		defensaTerminoProximidad[Constantes.EMPATE_O_GANANDO] = param;
	}

	public void setEntrenadorLineaDefensivaPerdiendo (int param) {
		entrenadorLineaDefensiva[Constantes.PERDIENDO] = param;
	}

	public void setEntrenadorLineaDefensivaEmpateGanando (int param) {
		entrenadorLineaDefensiva[Constantes.EMPATE_O_GANANDO] = param;
	}

	public void setEntrenadorDistanciaMinimaPasePerdiendo (int param) {
		entrenadorDistanciaMinimaPase[Constantes.PERDIENDO] = param;
	}

	public void setEntrenadorDistanciaMinimaPaseEmpateGanando (int param) {
		entrenadorDistanciaMinimaPase[Constantes.EMPATE_O_GANANDO] = param;
	}

	// ------- //
    // GETTERS //
    // ------- //

    public Alineacion getAlineacionPerdiendo () {
    	return alineacion[Constantes.PERDIENDO];
    }

    public Alineacion getAlineacionEmpateGanando () {
    	 return alineacion[Constantes.EMPATE_O_GANANDO];
    }

    public Fuerza getFuerza () {
    	return fuerza;
    }

	public DistanciaIrBola getDistanciaPerdiendo() {
		return distancia[Constantes.PERDIENDO];
	}

	public DistanciaIrBola getDistanciaEmpateGanando() {
		return distancia[Constantes.EMPATE_O_GANANDO];
	}

	public int getPorteroBarreraPerdiendo () {
		return porteroBarrera[Constantes.PERDIENDO];
	}

	public int getPorteroBarreraEmpateGanando () {
		return porteroBarrera[Constantes.EMPATE_O_GANANDO];
	}

	public int getPorteroLateralPerdiendo () {
		return porteroLateral[Constantes.PERDIENDO];
	}

	public int getPorteroLateralEmpateGanando () {
		return porteroLateral[Constantes.EMPATE_O_GANANDO];
	}

	public int getPorteroFactorProximidadPerdiendo () {
		return porteroFactorProximidad[Constantes.PERDIENDO];
	}

	public int getPorteroFactorProximidadEmpateGanando () {
		return porteroFactorProximidad[Constantes.EMPATE_O_GANANDO];
	}

	public int getDefensaFactorProximidadPerdiendo () {
		return defensaFactorProximidad[Constantes.PERDIENDO];
	}

	public int getDefensaFactorProximidadEmpateGanando () {
		return defensaFactorProximidad[Constantes.EMPATE_O_GANANDO];
	}

	public int getDefensaTerminoProximidadPerdiendo () {
		return defensaTerminoProximidad[Constantes.PERDIENDO];
	}

	public int getDefensaTerminoProximidadEmpateGanando () {
		return defensaTerminoProximidad[Constantes.EMPATE_O_GANANDO];
	}

	public int getEntrenadorLineaDefensivaPerdiendo () {
		return entrenadorLineaDefensiva[Constantes.PERDIENDO];
	}

	public int getEntrenadorLineaDefensivaEmpateGanando () {
		return entrenadorLineaDefensiva[Constantes.EMPATE_O_GANANDO];
	}

	public int getEntrenadorDistanciaMinimaPasePerdiendo () {
		return entrenadorDistanciaMinimaPase[Constantes.PERDIENDO];
	}

	public int getEntrenadorDistanciaMinimaPaseEmpateGanando () {
		return entrenadorDistanciaMinimaPase[Constantes.EMPATE_O_GANANDO];
	}

	public int[] getDefensaFactorProximidad() {
		return defensaFactorProximidad;
	}

	public int[] getDefensaTerminoProximidad() {
		return defensaTerminoProximidad;
	}

	public int[] getEntrenadorDistanciaMinimaPase() {
		return entrenadorDistanciaMinimaPase;
	}

	public int[] getEntrenadorLineaDefensiva() {
		return entrenadorLineaDefensiva;
	}

	public int[] getPorteroBarrera() {
		return porteroBarrera;
	}

	public int[] getPorteroFactorProximidad() {
		return porteroFactorProximidad;
	}

	public int[] getPorteroLateral() {
		return porteroLateral;
	}

	public DistanciaIrBola[] getDistancia() {
		return distancia;
	}

} // public class Genotipo
